package com.link.base.wechat.payment.service;

import com.link.base.wechat.payment.model.CoPayToWalletPayment;
import com.link.base.wechat.payment.model.WxPayment;
import com.link.base.wechat.payment.util.PayUtils;

import java.util.Map;

/**
 * 支付服务类
 *
 * @author LiQun
 * @date 2019/2/25 17:12
 */
public interface WxPaymentService {
    /**
     * 设置支付信息
     *
     * @author LiQun
     * @date 2019/2/25 18:56
     * @param appId     小程序/微信公众号appid
     * @param mchId     商户号id
     * @param tradeNo   商户订单号
     * @param notifyUrl 通知地址 异步接收微信支付结果通知的回调地址，通知url必须为外网可访问的url，不能携带参数。
     * @param totalFee  标价金额(订单总金额)
     * @param tradeType 交易类型
     *                  JSAPI - JSAPI支付 小程序/微信公众号全部都为JSAPI
     *                  NATIVE - Native支付
     *                  APP - APP支付
     * @param body      商品描述
     * @param attach    附加数据 在查询API和支付通知中原样返回，可作为自定义参数使用
     * @param apiKey    为商户平台设置的密钥key
     * @param openId    当前支付用户的openId
     * @return 支付对象
     * @throws Exception 异常信息
     */
    WxPayment getPayment(
            String appId,
            String mchId,
            String tradeNo,
            String notifyUrl,
            Integer totalFee,
            String tradeType,
            String body,
            String attach,
            String apiKey,
            String openId
    ) throws Exception;

    /**
     * 创建微信支付签名
     *
     * @author LiQun
     * @date 2019/2/26 19:01
     * @param wxPayment 微信支付对象
     * @param apiKey 为商户平台设置的密钥key
     * @return 微信支付签名
     * @throws Exception 异常信息
     */
    String createWxPaymentSign(WxPayment wxPayment, String apiKey) throws Exception;

    /**
     * 微信支付调用统一下单接口
     *
     * @author LiQun
     * @date 2019/2/26 14:37
     * @param wxPayment 微信付款对象
     * @return map对象,包含付款请求相应信息
     * @throws Exception 异常信息
     */
    public Map<String, Object> unifiedOrder(WxPayment wxPayment) throws Exception;

    /**
     * 获取企业微信支付对象
     *
     * @author LiQun
     * @date 2019/2/26 20:51
     * @param appId 申请商户号的appid或商户号绑定的appid
     * @param mchId 商户号
     * @param openId 支付的用户的openId
     * @param amount 支付的金额,单位是(分),最小为300分(0.3元)
     * @param partnerTradeNo 订单编号
     * @param apiKey 为商户平台设置的密钥key
     * @param forceCheck 是否强制校验姓名
     * @param reUserName 如果强制校验姓名,需要输入姓名
     * @param desc 描述信息
     * @return 企业微信支付对象
     * @throws Exception 异常信息
     */
    CoPayToWalletPayment getCoPayToWalletPayment(
            String appId,
            String mchId,
            String openId,
            Integer amount,
            String partnerTradeNo,
            String apiKey,
            PayUtils.ForceCheck forceCheck,
            String reUserName,
            String desc
    ) throws Exception;

    /**
     * 创建企业付款到零钱签名
     *
     * @author LiQun
     * @date 2019/2/27 09:15
     * @param coPayToWalletPayment 企业付款到零钱对象
     * @param apiKey 为商户平台设置的密钥key
     * @return 企业付款到零钱签名
     * @throws Exception 异常信息
     */
    public String createCoPayToWalletPaymentSign(CoPayToWalletPayment coPayToWalletPayment, String apiKey) throws Exception;

    /**
     * 发送企业付款到零钱请求
     *
     * @author LiQun
     * @date 2019/2/27 10:53
     */
    public Map<String,Object> sendCoPayToWalletPaymentRequest(CoPayToWalletPayment coPayToWalletPayment) throws Exception;
}
